/** * Most of the code in the Qalingo project is copyrighted Hoteia and licensed * under the Apache License Version 2.0 (release version 0.8.0) * http://www.apache.org/licenses/LICENSE-2.0 * * Copyright (c) Hoteia, 2012-2014 * http://www.hoteia.com - http://twitter.com/hoteia - contact@hoteia.com * */ package org.hoteia.qalingo.core.dao; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Random; import javax.persistence.NonUniqueResultException; import org.hibernate.Criteria; import org.hibernate.FetchMode; import org.hibernate.Query; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Subqueries; import org.hibernate.sql.JoinType; import org.hoteia.qalingo.core.domain.Asset; import org.hoteia.qalingo.core.domain.CatalogCategoryMasterProductSkuRel; import org.hoteia.qalingo.core.domain.CatalogCategoryVirtualProductSkuRel; import org.hoteia.qalingo.core.domain.ProductBrand; import org.hoteia.qalingo.core.domain.ProductBrandCustomerComment; import org.hoteia.qalingo.core.domain.ProductBrandCustomerRate; import org.hoteia.qalingo.core.domain.ProductBrandStoreRel; import org.hoteia.qalingo.core.domain.ProductMarketing; import org.hoteia.qalingo.core.domain.ProductMarketingCustomerComment; import org.hoteia.qalingo.core.domain.ProductMarketingCustomerRate; import org.hoteia.qalingo.core.domain.ProductSku; import org.hoteia.qalingo.core.domain.ProductSkuCustomerComment; import org.hoteia.qalingo.core.domain.ProductSkuOptionDefinition; import org.hoteia.qalingo.core.domain.ProductSkuOptionDefinitionType; import org.hoteia.qalingo.core.domain.ProductSkuStorePrice; import org.hoteia.qalingo.core.domain.ProductSkuStoreRel; import org.hoteia.qalingo.core.domain.Store; import org.hoteia.qalingo.core.fetchplan.FetchPlan; import org.hoteia.qalingo.core.fetchplan.catalog.FetchPlanGraphProduct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Repository; @Repository("productDao") public class ProductDao extends AbstractGenericDao { private final Logger logger = LoggerFactory.getLogger(getClass()); // PRODUCT MARKETING public ProductMarketing getProductMarketingById(final Long productMarketingId, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); FetchPlan fetchPlan = handleSpecificProductMarketingFetchMode(criteria, params); criteria.add(Restrictions.eq("id", productMarketingId)); ProductMarketing productMarketing = (ProductMarketing) criteria.uniqueResult(); if(productMarketing != null){ productMarketing.setFetchPlan(fetchPlan); } return productMarketing; } public ProductMarketing getProductMarketingByCode(final String productMarketingCode, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); FetchPlan fetchPlan = handleSpecificProductMarketingFetchMode(criteria, params); criteria.add(Restrictions.eq("code", handleCodeValue(productMarketingCode))); ProductMarketing productMarketing = (ProductMarketing) criteria.uniqueResult(); if(productMarketing != null){ productMarketing.setFetchPlan(fetchPlan); } return productMarketing; } public Long countProductMarketing() { Criteria criteria = createDefaultCriteria(ProductMarketing.class); criteria.setProjection(Projections.rowCount()); return (Long) criteria.uniqueResult(); } public List<ProductMarketing> findAllProductMarketings(Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); handleSpecificProductMarketingFetchMode(criteria, params); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductMarketing> productMarketings = criteria.list(); return productMarketings; } public List<Long> findAllProductMarketingIds(int maxResults) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); criteria.setProjection(Projections.property("id")); criteria.addOrder(Order.asc("id")); if(maxResults != 0){ criteria.setMaxResults(maxResults); } @SuppressWarnings("unchecked") List<Long> productMarketingIds = criteria.list(); return productMarketingIds; } public List<ProductMarketing> findProductMarketingByRandom(int maxResults, Object... params) { Random randomGenerator = new Random(); int randomInt = randomGenerator.nextInt(1000); Criteria criteria = createDefaultCriteria(ProductMarketing.class); handleSpecificProductMarketingFetchMode(criteria, params); criteria.add(Restrictions.sqlRestriction("1=1 ORDER BY RAND(" + randomInt + ")")); criteria.setMaxResults(maxResults); @SuppressWarnings("unchecked") List<ProductMarketing> productMarketings = criteria.list(); return productMarketings; } public List<ProductMarketing> findProductMarketingEnableB2CByRandom(int maxResults, Object... params) { Random randomGenerator = new Random(); int randomInt = randomGenerator.nextInt(1000); Criteria criteria = createDefaultCriteria(ProductMarketing.class); handleSpecificProductMarketingFetchMode(criteria, params); criteria.add(Restrictions.eq("enabledB2C", true)); criteria.add(Restrictions.sqlRestriction("1=1 ORDER BY RAND(" + randomInt + ")")); criteria.setMaxResults(maxResults); @SuppressWarnings("unchecked") List<ProductMarketing> productMarketings = criteria.list(); return productMarketings; } public List<ProductMarketing> findProductMarketings(final String text, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); handleSpecificProductMarketingFetchMode(criteria, params); criteria.add(Restrictions.or(Restrictions.like("code", text, MatchMode.ANYWHERE), Restrictions.like("name", text, MatchMode.ANYWHERE), Restrictions.like("description", text, MatchMode.ANYWHERE))); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductMarketing> productMarketings = criteria.list(); return productMarketings; } public List<Long> findProductMarketingIdsByBrandId(final Long brandId, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); criteria.setFetchMode("productBrand", FetchMode.JOIN); criteria.createAlias("productBrand", "productBrand", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("productBrand.id", brandId)); criteria.setProjection(Projections.property("id")); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<Long> productMarketings = criteria.list(); return productMarketings; } public List<ProductMarketing> findProductMarketingsByBrandId(final Long brandId, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); handleSpecificProductMarketingFetchMode(criteria, params); criteria.setFetchMode("productBrand", FetchMode.JOIN); criteria.createAlias("productBrand", "productBrand", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("productBrand.id", brandId)); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductMarketing> productMarketings = criteria.list(); return productMarketings; } public List<ProductMarketing> findProductMarketingsByBrandCode(final String brandCode, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); handleSpecificProductMarketingFetchMode(criteria, params); criteria.setFetchMode("productBrand", FetchMode.JOIN); criteria.createAlias("productBrand", "productBrand", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("productBrand.code", handleCodeValue(brandCode))); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductMarketing> productMarketings = criteria.list(); return productMarketings; } public List<ProductMarketing> findProductMarketingsByMasterCatalogCategoryId(final Long categoryId, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); handleSpecificProductMarketingFetchMode(criteria, params); criteria.createAlias("productSkus", "productSku", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("productSku.catalogCategoryMasterProductSkuRels", "catalogCategoryProductSkuRel", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("catalogCategoryProductSkuRel.pk.catalogCategoryMaster.id", categoryId)); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductMarketing> productMarketings = criteria.list(); return productMarketings; } public List<ProductMarketing> findProductMarketingsNotInThisMasterCatalogCategoryId(final Long categoryId, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); handleSpecificProductMarketingFetchMode(criteria, params); criteria.createAlias("productSkus", "productSku", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("productSku.catalogCategoryMasterProductSkuRels", "catalogCategoryProductSkuRel", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.ne("catalogCategoryProductSkuRel.pk.catalogCategoryMaster.id", categoryId)); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductMarketing> productMarketings = criteria.list(); return productMarketings; } public List<ProductMarketing> findProductMarketingsByVirtualCatalogCategoryId(final Long categoryId, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); handleSpecificProductMarketingFetchMode(criteria, params); criteria.createAlias("productSkus", "productSku", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("productSku.catalogCategoryVirtualProductSkuRels", "catalogCategoryProductSkuRel", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("catalogCategoryProductSkuRel.pk.catalogCategoryVirtual.id", categoryId)); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductMarketing> productMarketings = criteria.list(); return productMarketings; } public List<ProductMarketing> findProductMarketingsNotInThisVirtualCatalogCategoryId(final Long categoryId, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketing.class); handleSpecificProductMarketingFetchMode(criteria, params); criteria.createAlias("productSkus", "productSku", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("productSku.catalogCategoryVirtualProductSkuRels", "catalogCategoryProductSkuRel", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.ne("catalogCategoryProductSkuRel.pk.catalogCategoryVirtual.id", categoryId)); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductMarketing> productMarketings = criteria.list(); return productMarketings; } public ProductMarketing saveOrUpdateProductMarketing(final ProductMarketing productMarketing) { if(productMarketing.getDateCreate() == null){ productMarketing.setDateCreate(new Date()); } productMarketing.setDateUpdate(new Date()); if (productMarketing.getId() != null) { if(em.contains(productMarketing)){ em.refresh(productMarketing); } ProductMarketing mergedProductMarketing = em.merge(productMarketing); em.flush(); return mergedProductMarketing; } else { em.persist(productMarketing); return productMarketing; } } public ProductMarketing createProductMarketing(final ProductMarketing productMarketing) { productMarketing.setDateCreate(new Date()); productMarketing.setDateUpdate(new Date()); em.persist(productMarketing); return productMarketing; } public ProductMarketing updateProductMarketing(final ProductMarketing productMarketing) { productMarketing.setDateUpdate(new Date()); return em.merge(productMarketing); } public void deleteProductMarketing(final ProductMarketing productMarketing) { em.remove(em.contains(productMarketing) ? productMarketing : em.merge(productMarketing)); } // PRODUCT MARKETING COMMENT/RATE @SuppressWarnings("unchecked") public List<ProductMarketingCustomerComment> findProductMarketingCustomerCommentsByProductMarketingId(final Long productMarketingId, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketingCustomerComment.class); criteria.createAlias("customer", "customer", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("productMarketing", "productMarketing", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("productMarketing.id", productMarketingId)); criteria.addOrder(Order.asc("dateCreate")); return criteria.list(); } @SuppressWarnings("unchecked") public List<ProductMarketingCustomerComment> findProductMarketingCustomerCommentsByProductMarketingIdAndMarketAreaId(final Long productMarketingId, final Long marketAreaId, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketingCustomerComment.class); criteria.createAlias("customer", "customer", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("productMarketing", "productMarketing", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("productMarketing.id", productMarketingId)); criteria.add(Restrictions.eq("marketAreaId", marketAreaId)); criteria.addOrder(Order.asc("dateCreate")); return criteria.list(); } @SuppressWarnings("unchecked") public List<ProductMarketingCustomerComment> findProductMarketingCustomerCommentsByCustomerId(final Long customerId, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketingCustomerComment.class); criteria.createAlias("customer", "customer", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("customer.id", customerId)); criteria.createAlias("productMarketing", "productMarketing", JoinType.LEFT_OUTER_JOIN); criteria.addOrder(Order.asc("dateCreate")); return criteria.list(); } @SuppressWarnings("unchecked") public List<ProductSkuCustomerComment> findProductSkuCustomerCommentsByCustomerId(final Long customerId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSkuCustomerComment.class); criteria.createAlias("customer", "customer", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("customer.id", customerId)); criteria.createAlias("productSku", "productSku", JoinType.LEFT_OUTER_JOIN); criteria.addOrder(Order.asc("dateCreate")); return criteria.list(); } @SuppressWarnings("unchecked") public List<ProductMarketingCustomerRate> findProductMarketingCustomerRatesByProductMarketingId(final Long productMarketingId, final String type, Object... params) { Criteria criteria = createDefaultCriteria(ProductMarketingCustomerRate.class); criteria.createAlias("productMarketing", "productMarketing", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("productMarketing.id", productMarketingId)); criteria.add(Restrictions.eq("type", type)); criteria.addOrder(Order.asc("dateCreate")); return criteria.list(); } public Float calculateProductMarketingCustomerRatesByProductMarketingId(final Long productMarketingId) { String sql = "select avg(rate) from ProductMarketingCustomerRate where productMarketingId = :productMarketingId"; Query query = getSession().createQuery(sql); query.setLong("productMarketingId", productMarketingId); Double value = (Double) query.uniqueResult(); if(value != null){ return value.floatValue(); } return 0F; } public ProductMarketingCustomerRate saveOrUpdateProductMarketingCustomerRate(final ProductMarketingCustomerRate productMarketingCustomerRate) { if(productMarketingCustomerRate.getDateCreate() == null){ productMarketingCustomerRate.setDateCreate(new Date()); } productMarketingCustomerRate.setDateUpdate(new Date()); if (productMarketingCustomerRate.getId() != null) { if(em.contains(productMarketingCustomerRate)){ em.refresh(productMarketingCustomerRate); } ProductMarketingCustomerRate mergedProductMarketingCustomerRate = em.merge(productMarketingCustomerRate); em.flush(); return mergedProductMarketingCustomerRate; } else { em.persist(productMarketingCustomerRate); return productMarketingCustomerRate; } } public void deleteProductMarketingCustomerRate(final ProductMarketingCustomerRate productMarketingCustomerRate) { em.remove(em.contains(productMarketingCustomerRate) ? productMarketingCustomerRate : em.merge(productMarketingCustomerRate)); } public ProductMarketingCustomerComment saveOrUpdateProductMarketingCustomerComment(final ProductMarketingCustomerComment productMarketingCustomerComment) { if(productMarketingCustomerComment.getDateCreate() == null){ productMarketingCustomerComment.setDateCreate(new Date()); } productMarketingCustomerComment.setDateUpdate(new Date()); if (productMarketingCustomerComment.getId() != null) { if(em.contains(productMarketingCustomerComment)){ em.refresh(productMarketingCustomerComment); } ProductMarketingCustomerComment mergedProductMarketingCustomerComment = em.merge(productMarketingCustomerComment); em.flush(); return mergedProductMarketingCustomerComment; } else { em.persist(productMarketingCustomerComment); return productMarketingCustomerComment; } } public void deleteProductMarketingCustomerComment(final ProductMarketingCustomerComment productMarketingCustomerComment) { em.remove(em.contains(productMarketingCustomerComment) ? productMarketingCustomerComment : em.merge(productMarketingCustomerComment)); } // PRODUCT MARKETING ASSET public Asset getProductMarketingAssetById(final Long productMarketingAssetId, Object... params) { Criteria criteria = createDefaultCriteria(Asset.class); criteria.add(Restrictions.eq("id", productMarketingAssetId)); Asset productMarketingAsset = (Asset) criteria.uniqueResult(); return productMarketingAsset; } public Asset saveOrUpdateProductMarketingAsset(final Asset productMarketingAsset) { if(productMarketingAsset.getDateCreate() == null){ productMarketingAsset.setDateCreate(new Date()); } productMarketingAsset.setDateUpdate(new Date()); if (productMarketingAsset.getId() != null) { if(em.contains(productMarketingAsset)){ em.refresh(productMarketingAsset); } Asset mergedAsset = em.merge(productMarketingAsset); em.flush(); return mergedAsset; } else { em.persist(productMarketingAsset); return productMarketingAsset; } } public void deleteProductMarketingAsset(final Asset productMarketingAsset) { em.remove(em.contains(productMarketingAsset) ? productMarketingAsset : em.merge(productMarketingAsset)); } protected FetchPlan handleSpecificProductMarketingFetchMode(Criteria criteria, Object... params) { if (params != null && params.length > 0) { return super.handleSpecificFetchMode(criteria, params); } else { return super.handleSpecificFetchMode(criteria, FetchPlanGraphProduct.productMarketingDefaultFetchPlan()); } } // PRODUCT SKU public ProductSku getProductSkuById(final Long productSkuId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSku.class); FetchPlan fetchPlan = handleSpecificProductSkuFetchMode(criteria, params); criteria.add(Restrictions.eq("id", productSkuId)); ProductSku productSku = (ProductSku) criteria.uniqueResult(); if(productSku != null){ productSku.setFetchPlan(fetchPlan); } return productSku; } public ProductSku getProductSkuByCode(final String skuCode, Object... params) { Criteria criteria = createDefaultCriteria(ProductSku.class); FetchPlan fetchPlan = handleSpecificProductSkuFetchMode(criteria, params); criteria.add(Restrictions.eq("code", handleCodeValue(skuCode))); ProductSku productSku = (ProductSku) criteria.uniqueResult(); if(productSku != null){ productSku.setFetchPlan(fetchPlan); } return productSku; } public ProductSku getProductSkuByEAN(final String skuEAN, Object... params) { Criteria criteria = createDefaultCriteria(ProductSku.class); FetchPlan fetchPlan = handleSpecificProductSkuFetchMode(criteria, params); criteria.add(Restrictions.eq("ean", handleCodeValue(skuEAN))); ProductSku productSku = (ProductSku) criteria.uniqueResult(); if(productSku != null){ productSku.setFetchPlan(fetchPlan); } return productSku; } public Long countProductSku() { Criteria criteria = createDefaultCriteria(ProductSku.class); criteria.setProjection(Projections.rowCount()); return (Long) criteria.uniqueResult(); } public List<Long> findProductSkuIds(int maxResults) { Criteria criteria = createDefaultCriteria(ProductSku.class); criteria.setProjection(Projections.property("id")); criteria.addOrder(Order.asc("id")); if(maxResults != 0){ criteria.setMaxResults(maxResults); } @SuppressWarnings("unchecked") List<Long> productSkuIds = criteria.list(); return productSkuIds; } public List<String> findProductSkuCode(int maxResults) { Criteria criteria = createDefaultCriteria(ProductSku.class); criteria.setProjection(Projections.property("code")); criteria.addOrder(Order.asc("code")); if(maxResults != 0){ criteria.setMaxResults(maxResults); } @SuppressWarnings("unchecked") List<String> productSkuIds = criteria.list(); return productSkuIds; } public List<Long> findProductSkuIdsEnableB2COrderByDateUpdate(int maxResults) { Criteria criteria = createDefaultCriteria(ProductSku.class); criteria.setProjection(Projections.property("id")); criteria.add(Restrictions.eq("enabledB2C", true)); criteria.addOrder(Order.asc("dateUpdate")); if(maxResults != 0){ criteria.setMaxResults(maxResults); } @SuppressWarnings("unchecked") List<Long> productSkuIds = criteria.list(); return productSkuIds; } public List<ProductSku> findProductSkusByproductMarketingId(final Long productMarketingId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSku.class); handleSpecificProductSkuFetchMode(criteria, params); criteria.add(Restrictions.eq("productMarketing.id", productMarketingId)); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductSku> productSkus = criteria.list(); return productSkus; } public List<Long> findProductSkuIdsByBrandId(final Long brandId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSku.class); criteria.createCriteria("productMarketing", "productMarketing", JoinType.LEFT_OUTER_JOIN).add(Restrictions.eq("productBrand.id", brandId)); criteria.setProjection(Projections.property("id")); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<Long> productMarketings = criteria.list(); return productMarketings; } public List<Long> findProductSkuIdsByBrandIdOrderByDateUpdate(final Long brandId, int maxResults, Object... params) { Criteria criteria = createDefaultCriteria(ProductSku.class); criteria.createCriteria("productMarketing", "productMarketing", JoinType.LEFT_OUTER_JOIN).add(Restrictions.eq("productBrand.id", brandId)); criteria.setProjection(Projections.property("id")); criteria.addOrder(Order.asc("dateUpdate")); if(maxResults != 0){ criteria.setMaxResults(maxResults); } @SuppressWarnings("unchecked") List<Long> productMarketings = criteria.list(); return productMarketings; } public List<ProductSku> findProductSkus(final String text, Object... params) { Criteria criteria = createDefaultCriteria(ProductSku.class); handleSpecificProductSkuFetchMode(criteria, params); criteria.add(Restrictions.or(Restrictions.eq("code", "%" + text + "%"))); criteria.add(Restrictions.or(Restrictions.eq("name", "%" + text + "%"))); criteria.add(Restrictions.or(Restrictions.eq("description", "%" + text + "%"))); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductSku> productSkus = criteria.list(); return productSkus; } public List<ProductSku> findProductSkusByMasterCatalogCategoryId(final Long categoryId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSku.class); handleSpecificProductSkuFetchMode(criteria, params); criteria.createAlias("catalogCategoryMasterProductSkuRels", "catalogCategoryProductSkuRel", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("catalogCategoryProductSkuRel.pk.catalogCategoryMaster.id", categoryId)); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductSku> productSkus = criteria.list(); return productSkus; } public List<ProductSku> findProductSkusNotInThisMasterCatalogCategoryId(final Long categoryId, Object... params) { DetachedCriteria subquery = DetachedCriteria.forClass(ProductSku.class); subquery.createAlias("catalogCategoryMasterProductSkuRels", "catalogCategoryProductSkuRel", JoinType.LEFT_OUTER_JOIN); subquery.add(Restrictions.eq("catalogCategoryProductSkuRel.pk.catalogCategoryMaster.id", categoryId)); subquery.setProjection(Projections.property("id")); Criteria criteria = createDefaultCriteria(ProductSku.class); handleSpecificProductSkuFetchMode(criteria, params); criteria.add(Subqueries.notIn("id", subquery)); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductSku> productSkus = criteria.list(); return productSkus; } public List<ProductSku> findProductSkusByVirtualCatalogCategoryId(final Long categoryId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSku.class); handleSpecificProductSkuFetchMode(criteria, params); criteria.createAlias("catalogCategoryVirtualProductSkuRels", "catalogCategoryProductSkuRel", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("catalogCategoryProductSkuRel.pk.catalogCategoryVirtual.id", categoryId)); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductSku> productSkus = criteria.list(); return productSkus; } public List<ProductSku> findProductSkusNotInThisVirtualCatalogCategoryId(final Long categoryId, Object... params) { Criteria criteriaSubListId = createDefaultCriteria(ProductSku.class); criteriaSubListId.createAlias("catalogCategoryVirtualProductSkuRels", "catalogCategoryProductSkuRel", JoinType.LEFT_OUTER_JOIN); criteriaSubListId.add(Restrictions.eq("catalogCategoryProductSkuRel.pk.catalogCategoryVirtual.id", categoryId)); // criteriaSubListId.setProjection(Projections.property("id")); @SuppressWarnings("unchecked") List<ProductSku> subProductSkus = criteriaSubListId.list(); List<Long> productSkuIds = new ArrayList<Long>(); for (Iterator<ProductSku> iterator = subProductSkus.iterator(); iterator.hasNext();) { ProductSku productSku = (ProductSku) iterator.next(); productSkuIds.add(productSku.getId()); } Criteria criteria = createDefaultCriteria(ProductSku.class); handleSpecificProductSkuFetchMode(criteria, params); criteria.add(Restrictions.not(Restrictions.in("id", productSkuIds))); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductSku> productSkus = criteria.list(); return productSkus; } public List<ProductSku> findProductSkusByStoreId(final Long storeId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSku.class); handleSpecificProductSkuFetchMode(criteria, params); criteria.createAlias("stores", "stores", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("stores.id", storeId)); criteria.addOrder(Order.asc("id")); @SuppressWarnings("unchecked") List<ProductSku> productSkus = criteria.list(); return productSkus; } public List<Long> findProductSkuIdsActiveByStoreId(final Long storeId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSku.class); criteria.setProjection(Projections.property("id")); criteria.createAlias("stores", "stores", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("stores.id", storeId)); criteria.add(Restrictions.eq("enabledB2C", true)); @SuppressWarnings("unchecked") List<Long> productSkuIds = criteria.list(); return productSkuIds; } public ProductSku saveOrUpdateProductSku(final ProductSku productSku) { if(productSku.getDateCreate() == null){ productSku.setDateCreate(new Date()); } productSku.setDateUpdate(new Date()); if (productSku.getId() != null) { if(em.contains(productSku)){ em.refresh(productSku); } ProductSku mergedProductSku = em.merge(productSku); em.flush(); return mergedProductSku; } else { em.persist(productSku); return productSku; } } public ProductSku createProductSku(final ProductSku productSku) { productSku.setDateCreate(new Date()); productSku.setDateUpdate(new Date()); em.persist(productSku); return productSku; } public ProductSku updateProductSku(final ProductSku productSku) { productSku.setDateUpdate(new Date()); ProductSku mergedProductSku = em.merge(productSku); return mergedProductSku; } public void deleteProductSku(final ProductSku productSku) { em.remove(em.contains(productSku) ? productSku : em.merge(productSku)); } protected FetchPlan handleSpecificProductSkuFetchMode(Criteria criteria, Object... params) { if (params != null && params.length > 0) { return super.handleSpecificFetchMode(criteria, params); } else { return super.handleSpecificFetchMode(criteria, FetchPlanGraphProduct.productSkuDefaultFetchPlan()); } } // PRODUCT SKU STORE public ProductSkuStoreRel findProductSkuStoreRelByStoreIdAndSpecificCode(final Long storeId, final String specificCode, Object... params) { Criteria criteria = createDefaultCriteria(ProductSkuStoreRel.class); criteria.createAlias("pk.store", "store", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.store.id", storeId)); criteria.add(Restrictions.eq("specificCode", specificCode)); handleSpecificProductSkuStoreRelFetchMode(criteria, params); ProductSkuStoreRel productSkuStoreRel = null; try { productSkuStoreRel = (ProductSkuStoreRel) criteria.uniqueResult(); } catch (NonUniqueResultException e) { logger.error("NonUniqueResultException: storeId='" + storeId + "', specificCode: '" + specificCode + "'"); @SuppressWarnings("unchecked") List<ProductSkuStoreRel> productSkuStoreRels = (List<ProductSkuStoreRel>) criteria.list(); for (Iterator<ProductSkuStoreRel> iterator = productSkuStoreRels.iterator(); iterator.hasNext();) { ProductSkuStoreRel productSkuStoreRelLog = (ProductSkuStoreRel) iterator.next(); logger.error("productSkuStoreRel: " + productSkuStoreRelLog.toString()); } } return productSkuStoreRel; } public List<ProductSkuStoreRel> findProductSkuPriceBySkuIdAndMarketAreaId(final Long productSkuId, final Long marketAreaId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSkuStoreRel.class); criteria.createAlias("pk.productSku", "productSku", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.productSku.id", productSkuId)); criteria.createAlias("prices", "price", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("price.marketAreaId", marketAreaId)); handleSpecificProductSkuStoreRelFetchMode(criteria, params); @SuppressWarnings("unchecked") List<ProductSkuStoreRel> productSkuStoreRels = criteria.list(); return productSkuStoreRels; } public List<ProductSkuStoreRel> findProductSkuStoreRelByProductSkuId(final Long productSkuId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSkuStoreRel.class); criteria.createAlias("pk.productSku", "productSku", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.productSku.id", productSkuId)); handleSpecificProductSkuStoreRelFetchMode(criteria, params); @SuppressWarnings("unchecked") List<ProductSkuStoreRel> productSkuStoreRels = criteria.list(); return productSkuStoreRels; } public List<ProductSkuStoreRel> getProductSkuStoreRelB2B(Object... params) { Criteria criteria = createDefaultCriteria(ProductSkuStoreRel.class); criteria.createAlias("configurations", "configurations", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("configurations.salableOnlineB2B", true)); handleSpecificProductSkuStoreRelFetchMode(criteria, params); @SuppressWarnings("unchecked") List<ProductSkuStoreRel> productSkuStoreRels = criteria.list(); return productSkuStoreRels; } public ProductSkuStoreRel findProductSkuStoreRelByStoreIdAndProductId(final Long storeId, final Long productSkuId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSkuStoreRel.class); criteria.createAlias("pk.store", "store", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.store.id", storeId)); criteria.createAlias("pk.productSku", "productSku", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.productSku.id", productSkuId)); handleSpecificProductSkuStoreRelFetchMode(criteria, params); ProductSkuStoreRel productSkuStoreRel = null; try { productSkuStoreRel = (ProductSkuStoreRel) criteria.uniqueResult(); } catch (NonUniqueResultException e) { logger.error("NonUniqueResultException: storeId='" + storeId + "', productSkuId: '" + productSkuId + "'"); List<ProductSkuStoreRel> productSkuStoreRels = (List<ProductSkuStoreRel>) criteria.list(); for (Iterator<ProductSkuStoreRel> iterator = productSkuStoreRels.iterator(); iterator.hasNext();) { ProductSkuStoreRel productSkuStoreRelExp = (ProductSkuStoreRel) iterator.next(); logger.error("productSkuStoreRel: " + productSkuStoreRelExp.toString()); } } return productSkuStoreRel; } public List<ProductSkuStoreRel> findProductSkuStoreRelByStoreId(final Long storeId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSkuStoreRel.class); criteria.createAlias("pk.store", "store", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.store.id", storeId)); handleSpecificProductSkuStoreRelFetchMode(criteria, params); @SuppressWarnings("unchecked") List<ProductSkuStoreRel> productSkuStoreRels = criteria.list(); return productSkuStoreRels; } public ProductSkuStoreRel saveNewProductSkuStoreRel(final ProductSkuStoreRel productSkuStoreRel) { productSkuStoreRel.setDateCreate(new Date()); productSkuStoreRel.setDateUpdate(new Date()); em.persist(productSkuStoreRel); return productSkuStoreRel; } public ProductSkuStoreRel updateProductSkuStoreRel(final ProductSkuStoreRel productSkuStoreRel) { productSkuStoreRel.setDateUpdate(new Date()); if(em.contains(productSkuStoreRel)){ em.refresh(productSkuStoreRel); } ProductSkuStoreRel mergedProductSkuStoreRel = em.merge(productSkuStoreRel); em.flush(); return mergedProductSkuStoreRel; } public void deleteProductSkuStoreRel(final ProductSkuStoreRel productSkuStoreRel) { em.remove(em.contains(productSkuStoreRel) ? productSkuStoreRel : em.merge(productSkuStoreRel)); } protected FetchPlan handleSpecificProductSkuStoreRelFetchMode(Criteria criteria, Object... params) { if (params != null && params.length > 0) { return super.handleSpecificFetchMode(criteria, params); } else { return super.handleSpecificFetchMode(criteria, FetchPlanGraphProduct.productSkuStoreRelDefaultFetchPlan()); } } // ASSET public Asset getProductSkuAssetById(final Long productSkuAssetId, Object... params) { Criteria criteria = createDefaultCriteria(Asset.class); criteria.add(Restrictions.eq("id", productSkuAssetId)); Asset productSkuAsset = (Asset) criteria.uniqueResult(); return productSkuAsset; } public Asset saveOrUpdateProductSkuAsset(final Asset productSkuAsset) { if(productSkuAsset.getDateCreate() == null){ productSkuAsset.setDateCreate(new Date()); } productSkuAsset.setDateUpdate(new Date()); if (productSkuAsset.getId() != null) { if(em.contains(productSkuAsset)){ em.refresh(productSkuAsset); } Asset mergedAsset = em.merge(productSkuAsset); em.flush(); return mergedAsset; } else { em.persist(productSkuAsset); return productSkuAsset; } } public void deleteProductSkuAsset(final Asset productSkuAsset) { em.remove(em.contains(productSkuAsset) ? productSkuAsset : em.merge(productSkuAsset)); } // PRODUCT SKU OPTION public ProductSkuOptionDefinition getProductSkuOptionDefinitionById(final Long productSkuOptionDefinitionId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSkuOptionDefinition.class); FetchPlan fetchPlan = handleSpecificProductSkuOptionDefinitionFetchMode(criteria, params); criteria.add(Restrictions.eq("id", productSkuOptionDefinitionId)); ProductSkuOptionDefinition productSkuOptionDefinition = (ProductSkuOptionDefinition) criteria.uniqueResult(); if(productSkuOptionDefinition != null){ productSkuOptionDefinition.setFetchPlan(fetchPlan); } return productSkuOptionDefinition; } public ProductSkuOptionDefinition getProductSkuOptionDefinitionByCode(final String productSkuOptionDefinitionCode, Object... params) { Criteria criteria = createDefaultCriteria(ProductSkuOptionDefinition.class); FetchPlan fetchPlan = handleSpecificProductSkuOptionDefinitionFetchMode(criteria, params); criteria.add(Restrictions.eq("code", handleCodeValue(productSkuOptionDefinitionCode))); ProductSkuOptionDefinition productSkuOptionDefinition = (ProductSkuOptionDefinition) criteria.uniqueResult(); if(productSkuOptionDefinition != null){ productSkuOptionDefinition.setFetchPlan(fetchPlan); } return productSkuOptionDefinition; } public List<ProductSkuOptionDefinition> findAllProductSkuOptionDefinitions(Object... params) { Criteria criteria = getSession().createCriteria(ProductSkuOptionDefinition.class); handleSpecificProductSkuOptionDefinitionFetchMode(criteria, params); // FIX a multiple entities issue : http://stackoverflow.com/questions/1995080/hibernate-criteria-returns-children-multiple-times-with-fetchtype-eager criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); @SuppressWarnings("unchecked") List<ProductSkuOptionDefinition> productSkuOptionDefinitions = criteria.list(); return productSkuOptionDefinitions; } public ProductSkuOptionDefinition saveOrUpdateProductSkuOptionDefinition(final ProductSkuOptionDefinition productSkuOptionDefinition) { if(productSkuOptionDefinition.getDateCreate() == null){ productSkuOptionDefinition.setDateCreate(new Date()); } productSkuOptionDefinition.setDateUpdate(new Date()); if (productSkuOptionDefinition.getId() != null) { if(em.contains(productSkuOptionDefinition)){ em.refresh(productSkuOptionDefinition); } ProductSkuOptionDefinition mergedProductSkuOptionDefinition = em.merge(productSkuOptionDefinition); em.flush(); return mergedProductSkuOptionDefinition; } else { em.persist(productSkuOptionDefinition); return productSkuOptionDefinition; } } public void deleteProductSkuOptionDefinition(final ProductSkuOptionDefinition productSkuOptionDefinition) { em.remove(em.contains(productSkuOptionDefinition) ? productSkuOptionDefinition : em.merge(productSkuOptionDefinition)); } protected FetchPlan handleSpecificProductSkuOptionDefinitionFetchMode(Criteria criteria, Object... params) { if (params != null && params.length > 0) { return super.handleSpecificFetchMode(criteria, params); } else { return super.handleSpecificFetchMode(criteria, FetchPlanGraphProduct.productSkuOptionDefinitionDefaultFetchPlan()); } } public ProductSkuOptionDefinitionType getProductSkuOptionDefinitionTypeById(final Long productSkuOptionDefinitionTypeId, Object... params) { Criteria criteria = createDefaultCriteria(ProductSkuOptionDefinitionType.class); FetchPlan fetchPlan = handleSpecificProductSkuOptionDefinitionTypeFetchMode(criteria, params); criteria.add(Restrictions.eq("id", productSkuOptionDefinitionTypeId)); ProductSkuOptionDefinitionType productSkuOptionDefinitionType = (ProductSkuOptionDefinitionType) criteria.uniqueResult(); if(productSkuOptionDefinitionType != null){ productSkuOptionDefinitionType.setFetchPlan(fetchPlan); } return productSkuOptionDefinitionType; } public ProductSkuOptionDefinitionType getProductSkuOptionDefinitionTypeByCode(final String productSkuOptionDefinitionTypeCode, Object... params) { Criteria criteria = createDefaultCriteria(ProductSkuOptionDefinitionType.class); FetchPlan fetchPlan = handleSpecificProductSkuOptionDefinitionTypeFetchMode(criteria, params); criteria.add(Restrictions.eq("code", handleCodeValue(productSkuOptionDefinitionTypeCode))); ProductSkuOptionDefinitionType productSkuOptionDefinitionType = (ProductSkuOptionDefinitionType) criteria.uniqueResult(); if(productSkuOptionDefinitionType != null){ productSkuOptionDefinitionType.setFetchPlan(fetchPlan); } return productSkuOptionDefinitionType; } public List<ProductSkuOptionDefinitionType> findAllProductSkuOptionDefinitionTypes(Object... params) { Criteria criteria = getSession().createCriteria(ProductSkuOptionDefinitionType.class); handleSpecificProductSkuOptionDefinitionTypeFetchMode(criteria, params); @SuppressWarnings("unchecked") List<ProductSkuOptionDefinitionType> productSkuOptionDefinitionTypes = criteria.list(); return productSkuOptionDefinitionTypes; } public ProductSkuOptionDefinitionType saveOrUpdateProductSkuOptionDefinitionType(final ProductSkuOptionDefinitionType productSkuOptionDefinitionType) { if(productSkuOptionDefinitionType.getDateCreate() == null){ productSkuOptionDefinitionType.setDateCreate(new Date()); } productSkuOptionDefinitionType.setDateUpdate(new Date()); if (productSkuOptionDefinitionType.getId() != null) { if(em.contains(productSkuOptionDefinitionType)){ em.refresh(productSkuOptionDefinitionType); } ProductSkuOptionDefinitionType mergedProductSkuOptionDefinitionType = em.merge(productSkuOptionDefinitionType); em.flush(); return mergedProductSkuOptionDefinitionType; } else { em.persist(productSkuOptionDefinitionType); return productSkuOptionDefinitionType; } } public void deleteProductSkuOptionDefinitionType(final ProductSkuOptionDefinitionType productSkuOptionDefinitionType) { em.remove(em.contains(productSkuOptionDefinitionType) ? productSkuOptionDefinitionType : em.merge(productSkuOptionDefinitionType)); } protected FetchPlan handleSpecificProductSkuOptionDefinitionTypeFetchMode(Criteria criteria, Object... params) { if (params != null && params.length > 0) { return super.handleSpecificFetchMode(criteria, params); } else { return super.handleSpecificFetchMode(criteria, FetchPlanGraphProduct.productSkuOptionDefinitionTypeDefaultFetchPlan()); } } // PRODUCT BRAND public ProductBrand getProductBrandById(final Long productBrandId, Object... params) { Criteria criteria = createDefaultCriteria(ProductBrand.class); FetchPlan fetchPlan = handleSpecificProductBrandFetchMode(criteria, params); criteria.add(Restrictions.eq("id", productBrandId)); ProductBrand productBrand = (ProductBrand) criteria.uniqueResult(); if(productBrand != null){ productBrand.setFetchPlan(fetchPlan); } return productBrand; } public ProductBrand getProductBrandByCode(final String productBrandCode, Object... params) { Criteria criteria = createDefaultCriteria(ProductBrand.class); FetchPlan fetchPlan = handleSpecificProductBrandFetchMode(criteria, params); criteria.add(Restrictions.eq("code", handleCodeValue(productBrandCode))); ProductBrand productBrand = (ProductBrand) criteria.uniqueResult(); if(productBrand != null){ productBrand.setFetchPlan(fetchPlan); } return productBrand; } public Long countProductBrand() { Criteria criteria = createDefaultCriteria(ProductBrand.class); criteria.setProjection(Projections.rowCount()); return (Long) criteria.uniqueResult(); } public List<ProductBrand> findAllProductBrands(Object... params) { Criteria criteria = getSession().createCriteria(ProductBrand.class); handleSpecificProductBrandFetchMode(criteria, params); criteria.addOrder(Order.asc("name")); @SuppressWarnings("unchecked") List<ProductBrand> productBrands = criteria.list(); return productBrands; } public List<Long> findAllProductBrandIds() { Criteria criteria = getSession().createCriteria(ProductBrand.class); criteria.setProjection(Projections.property("id")); criteria.addOrder(Order.asc("name")); @SuppressWarnings("unchecked") List<Long> productBrandIds = criteria.list(); return productBrandIds; } public List<Long> findAllProductBrandIdsEnabled(Object... params) { Criteria criteria = getSession().createCriteria(ProductBrand.class); criteria.setProjection(Projections.property("id")); criteria.add(Restrictions.eq("enabled", true)); criteria.addOrder(Order.asc("name")); @SuppressWarnings("unchecked") List<Long> productBrands = criteria.list(); return productBrands; } public List<Long> findAllProductBrandIdsEnabledB2B(Object... params) { Criteria criteria = getSession().createCriteria(ProductBrand.class); criteria.setProjection(Projections.property("id")); criteria.add(Restrictions.eq("enabledB2B", true)); criteria.addOrder(Order.asc("name")); @SuppressWarnings("unchecked") List<Long> productBrands = criteria.list(); return productBrands; } public List<Long> findAllProductBrandIdsEnabledB2C(Object... params) { Criteria criteria = getSession().createCriteria(ProductBrand.class); criteria.setProjection(Projections.property("id")); criteria.add(Restrictions.eq("enabledB2C", true)); criteria.addOrder(Order.asc("name")); @SuppressWarnings("unchecked") List<Long> productBrands = criteria.list(); return productBrands; } public List<ProductBrand> findAllProductBrandsEnabled(Object... params) { Criteria criteria = getSession().createCriteria(ProductBrand.class); handleSpecificProductBrandFetchMode(criteria, params); criteria.add(Restrictions.eq("enabled", true)); criteria.addOrder(Order.asc("name")); @SuppressWarnings("unchecked") List<ProductBrand> productBrands = criteria.list(); return productBrands; } public List<ProductBrand> findProductBrandsByCatalogCategoryCode(final String categoryCode, Object... params) { Criteria criteria = getSession().createCriteria(ProductBrand.class); handleSpecificProductBrandFetchMode(criteria, params); criteria.createAlias("productMarketings", "productMarketing", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("productMarketing.productSkus", "productSku", JoinType.LEFT_OUTER_JOIN); criteria.setFetchMode("productSku.defaultCatalogCategory", FetchMode.JOIN); criteria.createAlias("productSku.defaultCatalogCategory", "defaultCatalogCategory", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("defaultCatalogCategory.code", handleCodeValue(categoryCode))); @SuppressWarnings("unchecked") List<ProductBrand> productBrands = criteria.list(); return productBrands; } public List<ProductBrand> findProductBrandsByText(String text, Object... params) { Criteria criteria = createDefaultCriteria(ProductBrand.class); handleSpecificProductBrandFetchMode(criteria, params); criteria.add(Restrictions.or(Restrictions.like("name", text, MatchMode.ANYWHERE), Restrictions.like("description", text, MatchMode.ANYWHERE))); @SuppressWarnings("unchecked") List<ProductBrand> productBrands = criteria.list(); return productBrands; } public ProductBrand saveOrUpdateProductBrand(final ProductBrand productBrand) { if(productBrand.getDateCreate() == null){ productBrand.setDateCreate(new Date()); } productBrand.setDateUpdate(new Date()); if (productBrand.getId() != null) { if(em.contains(productBrand)){ em.refresh(productBrand); } ProductBrand mergedProductBrand = em.merge(productBrand); em.flush(); return mergedProductBrand; } else { em.persist(productBrand); return productBrand; } } public ProductBrand updateProductBrand(final ProductBrand productBrand) { productBrand.setDateUpdate(new Date()); return em.merge(productBrand); } public void deleteProductBrand(final ProductBrand productBrand) { em.remove(em.contains(productBrand) ? productBrand : em.merge(productBrand)); } public ProductBrandStoreRel getProductBrandStoreRelById(final ProductBrand productBrand, final Store store, Object... params) { Criteria criteria = createDefaultCriteria(ProductBrandStoreRel.class); criteria.createAlias("pk.productBrand", "pk.productBrand", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.productBrand.id", productBrand.getId())); criteria.createAlias("pk.store", "pk.store", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.store.id", store.getId())); ProductBrandStoreRel productBrandStoreRel = (ProductBrandStoreRel) criteria.uniqueResult(); return productBrandStoreRel; } public ProductBrandStoreRel findProductBrandStoreRelByStoreIdAndBrandId(final Long storeId, final Long productBrandId, Object... params) { Criteria criteria = createDefaultCriteria(ProductBrandStoreRel.class); criteria.createAlias("pk.store", "pk.store", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.store.id", storeId)); criteria.createAlias("pk.productBrand", "pk.productBrand", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.productBrand.id", productBrandId)); ProductBrandStoreRel productBrandStoreRel = (ProductBrandStoreRel) criteria.uniqueResult(); return productBrandStoreRel; } public List<Long> findStoreIdsByBrandId(final Long productBrandId, int maxResults, Object... params) { Criteria criteria = createDefaultCriteria(ProductBrandStoreRel.class); criteria.createAlias("pk.productBrand", "pk.productBrand", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.productBrand.id", productBrandId)); criteria.createAlias("pk.store", "pk.store", JoinType.LEFT_OUTER_JOIN); criteria.setProjection(Projections.property("pk.store.id")); criteria.addOrder(Order.asc("pk.store.id")); if(maxResults != 0){ criteria.setMaxResults(maxResults); } @SuppressWarnings("unchecked") List<Long> storeIds = criteria.list(); return storeIds; } public List<Long> findProductBrandIdsByStoreId(final Long storeId, int maxResults, Object... params) { Criteria criteria = createDefaultCriteria(ProductBrandStoreRel.class); criteria.createAlias("pk.store", "pk.store", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("pk.store.id", storeId)); criteria.createAlias("pk.productBrand", "pk.productBrand", JoinType.LEFT_OUTER_JOIN); criteria.setProjection(Projections.property("pk.productBrand.id")); criteria.addOrder(Order.asc("pk.productBrand.id")); if(maxResults != 0){ criteria.setMaxResults(maxResults); } @SuppressWarnings("unchecked") List<Long> storeIds = criteria.list(); return storeIds; } public ProductBrandStoreRel saveOrUpdateProductBrandStoreRel(final ProductBrandStoreRel productBrandStoreRel) { em.persist(productBrandStoreRel); return productBrandStoreRel; } public void deleteProductBrandStoreRel(final ProductBrandStoreRel productBrandStoreRel) { em.remove(em.contains(productBrandStoreRel) ? productBrandStoreRel : em.merge(productBrandStoreRel)); } public void deleteAllProductBrandStoreRelByBrandId(final Long brandId) { StringBuilder sql = new StringBuilder("delete from ProductBrandStoreRel "); sql.append("WHERE pk.productBrand.id = :brandId "); Query query = getSession().createQuery(sql.toString()); query.setLong("brandId", brandId); query.executeUpdate(); } // PRODUCT MARKETING COMMENT/RATE @SuppressWarnings("unchecked") public List<ProductBrandCustomerComment> findProductBrandCustomerCommentsByProductBrandId(final Long productBrandId, Object... params) { Criteria criteria = createDefaultCriteria(ProductBrandCustomerComment.class); criteria.createAlias("customer", "customer", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("productBrand", "productBrand", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("productBrand.id", productBrandId)); criteria.addOrder(Order.asc("dateCreate")); return criteria.list(); } @SuppressWarnings("unchecked") public List<ProductBrandCustomerComment> findProductBrandCustomerCommentsByProductBrandIdAndMarketAreaId(final Long productBrandId, final Long marketAreaId, Object... params) { Criteria criteria = createDefaultCriteria(ProductBrandCustomerComment.class); criteria.createAlias("customer", "customer", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("productBrand", "productBrand", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("productBrand.id", productBrandId)); criteria.add(Restrictions.eq("marketAreaId", marketAreaId)); criteria.addOrder(Order.asc("dateCreate")); return criteria.list(); } @SuppressWarnings("unchecked") public List<ProductBrandCustomerComment> findProductBrandCustomerCommentsByCustomerId(final Long customerId, Object... params) { Criteria criteria = createDefaultCriteria(ProductBrandCustomerComment.class); criteria.createAlias("customer", "customer", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("customer.id", customerId)); criteria.createAlias("productBrand", "productBrand", JoinType.LEFT_OUTER_JOIN); criteria.addOrder(Order.asc("dateCreate")); return criteria.list(); } @SuppressWarnings("unchecked") public List<ProductBrandCustomerRate> findProductBrandCustomerRatesByProductBrandId(final Long productBrandId, final String type, Object... params) { Criteria criteria = createDefaultCriteria(ProductBrandCustomerRate.class); criteria.createAlias("productBrand", "productBrand", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.eq("productBrand.id", productBrandId)); criteria.add(Restrictions.eq("type", type)); criteria.addOrder(Order.asc("dateCreate")); return criteria.list(); } public ProductBrandCustomerRate saveOrUpdateProductBrandCustomerRate(final ProductBrandCustomerRate productMarketingCustomerRate) { if(productMarketingCustomerRate.getDateCreate() == null){ productMarketingCustomerRate.setDateCreate(new Date()); } productMarketingCustomerRate.setDateUpdate(new Date()); if (productMarketingCustomerRate.getId() != null) { if(em.contains(productMarketingCustomerRate)){ em.refresh(productMarketingCustomerRate); } ProductBrandCustomerRate mergedProductBrandCustomerRate = em.merge(productMarketingCustomerRate); em.flush(); return mergedProductBrandCustomerRate; } else { em.persist(productMarketingCustomerRate); return productMarketingCustomerRate; } } public void deleteProductBrandCustomerRate(final ProductBrandCustomerRate productMarketingCustomerRate) { em.remove(em.contains(productMarketingCustomerRate) ? productMarketingCustomerRate : em.merge(productMarketingCustomerRate)); } public ProductBrandCustomerComment saveOrUpdateProductBrandCustomerComment(final ProductBrandCustomerComment customerComment) { if(customerComment.getDateCreate() == null){ customerComment.setDateCreate(new Date()); } customerComment.setDateUpdate(new Date()); if (customerComment.getId() != null) { if(em.contains(customerComment)){ em.refresh(customerComment); } ProductBrandCustomerComment mergedProductBrandCustomerComment = em.merge(customerComment); em.flush(); return mergedProductBrandCustomerComment; } else { em.persist(customerComment); return customerComment; } } public void deleteProductBrandCustomerComment(final ProductBrandCustomerComment customerComment) { em.remove(em.contains(customerComment) ? customerComment : em.merge(customerComment)); } protected FetchPlan handleSpecificProductBrandFetchMode(Criteria criteria, Object... params) { if (params != null && params.length > 0) { return super.handleSpecificFetchMode(criteria, params); } else { return super.handleSpecificFetchMode(criteria, FetchPlanGraphProduct.productBrandDefaultFetchPlan()); } } public void createCatalogCategoryMasterProductSkuRel(final CatalogCategoryMasterProductSkuRel catalogCategoryMasterProductSkuRel) { em.persist(catalogCategoryMasterProductSkuRel); } public void createCatalogCategoryVirtualProductSkuRel(final CatalogCategoryVirtualProductSkuRel catalogCategoryVirtualProductSkuRel) { em.persist(catalogCategoryVirtualProductSkuRel); } public List<ProductSkuStorePrice> findProductSkuStorePrices(final Long storeId, final Long productSkuId) { Criteria criteria = createDefaultCriteria(ProductSkuStorePrice.class); criteria.add(Restrictions.eq("store.id", storeId)); criteria.add(Restrictions.eq("productSku.id", productSkuId)); return criteria.list(); } }